//
//  JWKUserAccountViewModel.swift
//  Weibo
//
//  Created by 姜维克 on 16/5/23.
//  Copyright © 2016年 姜维克. All rights reserved.
//

import UIKit
import SVProgressHUD

//视图模型的作用
//- 视图模型要封装网络请求
//    - 数据的存储
//    - 逻辑的处理
//1.viewModel如果拥有逻辑处理的功能 就必须拥有一个模型

class JWKUserAccountViewModel: NSObject {
    //设置一个存取token和用户信息等数据的key值属性
    private let userInfoKey = "com.baidu.userInfoKey"

    //一个networktool单例属性
//    let networkTools : JWKNetworkTools = JWKNetworkTools.sharedTools
    
    //一个单例对象
    static let sharedUserAccountViewModel : JWKUserAccountViewModel = JWKUserAccountViewModel()
    
    //私有化构造方法,在构造方法中获取存在本地的数据给用户信息模型属性赋值
    private override init() {
        
        super.init()
        userAccount = readUserAccountInfo()
    }
    
    
    //一个用户信息模型属性
    var userAccount : JWKUserAccount?
    
    
    //设置一个登陆状态的属性
    var userLogin : Bool {
        //拿数据里的过期时间和当前时间比较
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending{
            return true
        }
        
        //如果过期 将userAccount 置为nil
        userAccount = nil
        return false
    }
    
    //设置头像的图片对应的url
    //增加一个用户头像地址 纯种NSURL地址
    //只读属性 特点:每次执行都会进行计算
    var iconUrl : NSURL?{
        
        let urlstring = userAccount?.avatar_large ?? ""
        return NSURL(string: urlstring)
    }
    
    //
    var statusesArray : [JWKStatus] = [JWKStatus]()
    
    
}

//获取token和用户信息  封装网络请求
extension JWKUserAccountViewModel{
    
    //获取token
    func getUserAccessToken(code:String,finished:(isSuccess:Bool)->Void){
        
        JWKNetworkTools.sharedTools.getUserAccessToken(code) { (responseObject, error) in
            if error != nil{
                //请求失败
                finished(isSuccess: false)
                return
            }
            
            //请求成功--获取到了token值---在这里还不能直接进行成功的闭包回调到oauth中,因为我们最终的目的是能展示欢迎页面获取到足够多的数据--还需获取用户信息
//            finished(isSuccess: true)
            
            //还要去获取用户的信息
            
            //能够get用户信息前提是上面的token等信息都获取了,实体内容不是空,所以可以强解,因为要继续判断是否能成功回调,所以把带isSuccess的闭包传值到获取用户信息的函数中
            self.getUserAccountInfo(responseObject!, finished: finished)
        }
        
        
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        
//        let parameters = ["client_id":client_id, "client_secret":client_secret, "grant_type":"authorization_code", "code":code,"redirect_uri":redirect_uri]
//        
//        
//        JWKNetworkTools.sharedTools.request("POST", urlString: urlString, parameters: parameters) { (responseObject, error) in
//            if error != nil{
//                SVProgressHUD.showWithStatus("世界上最遥远的距离就是没网")
//                print(error)
//                return
//            }
//            
//            //请求成功获取了token值
//            print(responseObject)
//            
//            //再根据token值来获取用户信息
//            self.getUserAccountInfo(responseObject!)
//        }
    }
    
    
    private func getUserAccountInfo(response:AnyObject,finished:(isSuccess:Bool)->Void){
        //能够get用户信息前提是上面的token等信息都获取了,实体内容不是空
        
        //虽然response肯定有值,但是和as?没关系,as?可以用来设置responseObject为可选项进行判断是否response能否转成字典类型;能的话就可以进行字典转模型等存入操作,反之就要进行失败处理,return
        //responseDict为字典类型失败--response不是字典类型--尝试转字典类型失败
        guard let responseDict = response as? [String : AnyObject] else{
            finished(isSuccess: false)
            return
        }
        
        //responseDict为字典类型成功
//        print(responseDict)
        
//
//        let access_token = responseDict["access_token"]!
//        let uid = responseDict["uid"]!
//        
//        
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        
//        let parameters = ["access_token":access_token, "uid":uid]
//        
//        
//        JWKNetworkTools.sharedTools.request("GET", urlString: urlString, parameters: parameters) { (responseObject, error) in
//            if error != nil{
//                SVProgressHUD.showWithStatus("世界上最遥远的距离就是没网")
//                print(error)
//                return
//            }
        JWKNetworkTools.sharedTools.getUserAccountInfo(responseDict) { (responseObject, error) in
            
            if error != nil{
                //请求用户信息失败
                finished(isSuccess: false)
                return
            }
        
            //请求成功获取了用户信息
            
            //如果实体内容 不是字典
            guard var infoDict = responseObject as? [String : AnyObject] else{
                finished(isSuccess: false)
                return
            }
            
            
            
//            print(responseObject)
            
            //把含token的字典-这个函数的参数和刚获取的用户字典拼接到一个字典中
//            var infoDict = responseObject as! [String : AnyObject]
            
            //统一用户信息和token等数据到一个字典中,保存到本地
            for (key,value) in responseDict{
                infoDict[key] = value
            }
            
            
            //所有的数据都添加到了新的infoDict--存入本地
            self.saveUserAccountInfo(infoDict)
            
            
            //如果实体内容 是字典(在这里token等数据是字典,用户信息也是字典,符合了最终的要求,可以执行oauth中的成功回调--利用code授权码可以正确得到所需数据)
            
            //存入本地之后才算真正的成功?
            finished(isSuccess: true)
        }
        
    }
    

}

//存取数据
extension JWKUserAccountViewModel{
    
    //存入数据到本地---字典转模型--字典--plist偏好设置
    private func saveUserAccountInfo(infoDict:[String:AnyObject]){
        
        //1.字典转模型
       let account = JWKUserAccount.init(dict: infoDict)
        
        //为了防止用户从未登陆状态跳到登陆状态时userAccount为nil
        userAccount = account
        //2.模型转字典
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        
        let infos = account.dictionaryWithValuesForKeys(keys)
        
        //存到偏好设置
       let userDefault = NSUserDefaults.standardUserDefaults()
        
        userDefault.setObject(infos, forKey: userInfoKey)
        
        userDefault.synchronize()
        
        //打印存入的有效数据
        print(infos)
        
        //打印沙盒地址
        print(NSHomeDirectory())
    }
    
    //读取数据
    func readUserAccountInfo()->(JWKUserAccount?){
        let userDefault = NSUserDefaults.standardUserDefaults()
        //打印沙盒地址
        print(NSHomeDirectory())
        
        
        guard let dict = userDefault.objectForKey(userInfoKey) as? [String:AnyObject] else{
            //如果是空
            //获取不到本地存储的数据
            
//            if !userLogin {
//                return
//            }
            return nil
        }
        
        //字典转模型
        let account = JWKUserAccount.init(dict: dict)
       
        
        return account

    }
    
}

//
//extension JWKUserAccountViewModel{
//    //MARK:加载网络数据
//     func loadStatusesData(finished:(isSuccess:Bool)->()){
//        
//        JWKNetworkTools.sharedTools.loadHomeStatusesData { (responseObject, error) in
//            if error != nil{
//                //失败
//                finished(isSuccess: false)
//                
//                return
//            }
//            
//            //请求到了网络数据
//            //如果不能转成字典类型
//            guard let dict = responseObject as? [String : AnyObject] else{
//                //失败
//                finished(isSuccess: false)
//                return
//            }
//            
//            //可以转成字典类型---取出statuses对应的数组
//            //如果不能取出字典数组
//            guard let statusesDictArray = dict["statuses"] as? [[String:AnyObject]] else{
//                //失败
//                finished(isSuccess: false)
//                return
//            }
//            
//            //            遍历字典数组
//            
//            //创建临时数组
//            var tempArr = [JWKStatus]()
//            for item in statusesDictArray{
//                //字典转模型
//                let status = JWKStatus.init(dict: item)
//                
//                tempArr.append(status)
//            }
//            
//            //赋值
//            self.statusesArray = tempArr
//            
//            //刷新tableView
//            finished(isSuccess: true)
//        }
//        
//        
//        
//    }
//
//}
